package cn.itcast.web.controller.system;

import cn.itcast.domain.company.Company;
import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.RoleService;
import cn.itcast.service.system.UserService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion;
import lombok.extern.java.Log;
import lombok.extern.log4j.Log4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("system/user")
@Log4j
//继承basecontroll
public class UserController extends BaseController {
    @Autowired
    private UserService userService;
    @Autowired
    private DeptService deptService;

    //用户列表查询
    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") Integer pageNum,
                       @RequestParam(defaultValue = "5") Integer pageSize
    ) {
      Subject subject = SecurityUtils.getSubject();
      subject.checkPermission("用户管理");
        log.info("执行用户列表开始");
        //获取企业id
        String companyId = getLoginCompanyId();
        PageInfo<User> pageInfo = userService.findByPage(companyId, pageNum, pageSize);
        //保存数据
        request.setAttribute("pageInfo", pageInfo);
        //返回到user-list.jsp
        return "system/user/user-list";
    }

    /**
     * 进入添加页面
     */
    @RequestMapping("toAdd")
    public String add(Model model) {
        //根据企业id查询
        List<User> userList = userService.findAll(getLoginCompanyId());
        //保存
        model.addAttribute("userList", userList);
        //查询部门  显示下拉列表
        List<Dept> deptList = deptService.findAll(getLoginCompanyId());
        model.addAttribute("deptList", deptList);


        return "system/user/user-add";
    }

    /**
     * 添加页面
     */
    @RequestMapping("/edit")
    public String editUser(User user) {
        //设置企业信息
        user.setCompanyId(getLoginCompanyId());
        user.setCompanyName(getLoginCompanyName());
        //判断是否存在,如果存在就是更新,不存在就是添加
        if (StringUtils.isEmpty(user.getId())) {
            //调用添加
            userService.save(user);
        } else {

            //更新
            userService.update(user);
        }

        return "redirect:/system/user/list";
    }

    /*
     * 修改页面
     * */
    @RequestMapping("toUpdate")
    public String update(String id, Model model) {
        //根据id查询企业
        User user = userService.findById(id);
        //查询部门 显示下拉列表
        List<Dept> deptList = deptService.findAll(getLoginCompanyId());
        model.addAttribute("deptList", deptList);
        //保存
        model.addAttribute("user", user);
        model.addAttribute("deptList", deptList);
        return "system/user/user-update";
    }
    /*     *//*根据id删除*//*
        @RequestMapping("delete")
        @ResponseBody//自动把方法的返回结果转为json对象
        public String delete(String id){
            userService.delete(id);
            return "redirect:/system/user/list";

        }*/

    @RequestMapping("/delete")
    @ResponseBody   // 自动把方法返回的结果转json
    public Map<String,Integer> delete(String id) {
        Map<String,Integer> map = new HashMap<>();
        // 调用service删除
        boolean flag = userService.delete(id);
        if (flag) {
            map.put("message",1);
        } else {
            map.put("message",0);
        }
        return map;
    }

    /**
     * 角色分配权限：
     * 功能入口：user-list.jsp点击角色
     * 请求地址：http://localhost:8080/system/user/roleList.do
     * 请求参数：id  用户id
     * 响应地址：user-role.jsp
     */
    @Autowired
    private RoleService roleService;
    @RequestMapping("/roleList")
    public String userRole(String id) {
        //根据id查询用户
        User user = userService.findById(id);

        //查询所有角色(目的:为了在复选框中显示)
        List<Role> roleList = roleService.findAll(getLoginCompanyId());

        //查询用户已拥有的权限(为了在复选框中选中)
        List<Role> userRoleList = roleService.findUserRoleByUserId(id);

        //保存用户拥有角色的全部权限id
        String userRoleIds= "";//创建一个空id对象

        //遍历用户拥有的权限userrolelist  先做判断,看是否为空,为空则不做遍历
        if(userRoleList !=null && userRoleList.size()>0){
            for (Role role : userRoleList) {
                userRoleIds += role.getId()+",";
            }
        }

        //保存
       request.setAttribute("user",user);
       request.setAttribute("roleList",roleList);
       request.setAttribute("userRoleIds",userRoleIds);
       //响应地址
        return "system/user/user-role";
    }

    /*保存用户角色
    * */
    /**
     * 角色分配权限：
     * 功能入口：角色分配权限：在user-role.jsp 点击保存
     * 请求地址：http://localhost:8080/system/user/changeRole
     * 请求参数：
     *      userId   用户id
     *      roleIds  多个角色id
     * 响应地址：重定向到列表
     */
    @RequestMapping("/changeRole")
    public String changeRole(String userId,String[] roleIds){
        //调用方法添加
        userService.changeRole(userId,roleIds);
        //返回userlist
        return "redirect:/system/user/list";

    }

}


